package aceim.app.view.page.transfers; import java.util.ArrayList; import java.util.List; import java.util.Locale; import aceim.api.dataentity.Buddy; import aceim.api.dataentity.ConnectionState; import aceim.api.dataentity.FileProgress; import aceim.api.dataentity.OnlineInfo; import aceim.api.utils.Logger; import aceim.app.R; import aceim.app.dataentity.Account; import aceim.app.dataentity.FileTransfer; import aceim.app.dataentity.listeners.IHasFileTransfer; import aceim.app.utils.DialogUtils; import aceim.app.utils.ViewUtils; import aceim.app.view.page.Page; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.os.RemoteException; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.webkit.MimeTypeMap; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; public class FileTransfers extends Page implements IHasFileTransfer { private static final String SAVE_PARAM_TRANSFERS = "FileTransfers"; private final Account mAccount; private final ArrayList<FileTransfer> mTransfers = new ArrayList<FileTransfer>(); private FileTransfersAdapter mAdapter; private ListView mList; @SuppressLint("DefaultLocale") private final OnClickListener mCancelAllClickListener = new OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder newBuilder = new AlertDialog.Builder(getMainActivity()); newBuilder.setMessage(getMainActivity().getString(R.string.are_you_sure_you_want_to_cancel, getMainActivity().getString(R.string.all_transfers).toLowerCase())).setCancelable(false).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { for (FileTransfer t : mTransfers) { try { getMainActivity().getCoreService().cancelFileTransfer(t.getProgress().getServiceId(), t.getMessageId()); } catch (RemoteException e) { getMainActivity().onRemoteException(e); } } mAdapter.clear(); } }).setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); DialogUtils.showBrandedDialog(newBuilder.create()); } }; private OnItemClickListener mItemClickListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { final FileTransfer ft = (FileTransfer) parent.getItemAtPosition(position); if (ft == null || ft.getProgress() == null) { return; } if (TextUtils.isEmpty(ft.getProgress().getError())) { if (ft.getProgress().getTotalSizeBytes() > 0 && ft.getProgress().getSentBytes() >= ft.getProgress().getTotalSizeBytes()) { if (ft.getProgress().isIncoming()) { MimeTypeMap mimeMap = MimeTypeMap.getSingleton(); //String extension = filePath.substring(filePath.lastIndexOf(".")+1); String extension = MimeTypeMap.getFileExtensionFromUrl(ft.getProgress().getFilePath()); String mime = mimeMap.getMimeTypeFromExtension(extension.toLowerCase(Locale.ENGLISH)); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse("file://" + ft.getProgress().getFilePath()), mime); try { getActivity().startActivity(intent); mAdapter.remove(ft); } catch (Exception e) { Logger.log(e); } } } else { AlertDialog.Builder newBuilder = new AlertDialog.Builder(getMainActivity()); newBuilder.setMessage(getMainActivity().getString(R.string.are_you_sure_you_want_to_cancel, ViewUtils.getFileNameFromPath(ft.getProgress().getFilePath()))).setCancelable(false).setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { try { getMainActivity().getCoreService().cancelFileTransfer(ft.getProgress().getServiceId(), ft.getProgress().getMessageId()); mAdapter.remove(ft); } catch (RemoteException e) { getMainActivity().onRemoteException(e); } } }).setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); DialogUtils.showBrandedDialog(newBuilder.create()); } } } }; public FileTransfers(Account account) { this.mAccount = account; } @Override public View createView(LayoutInflater inflater, ViewGroup group, Bundle saved) { View view = inflater.inflate(R.layout.file_transfers, null); view.findViewById(R.id.cancel_all).setOnClickListener(mCancelAllClickListener); view.findViewById(R.id.close).setOnClickListener(mRemoveMeClickListener); mList = (ListView) view.findViewById(R.id.list); mAdapter = new FileTransfersAdapter(group.getContext(), mTransfers); mList.setAdapter(mAdapter); mList.setOnItemClickListener(mItemClickListener); recoverFromStoredData(saved); return view; } @Override public Drawable getIcon(Context context) { return context.getResources().getDrawable(android.R.drawable.ic_menu_save); } @Override public String getTitle(Context context) { return context.getString(R.string.file_transfers, mAccount.getSafeName()); } @Override public void onBuddyStateChanged(List<Buddy> buddy) {} @Override public Buddy getBuddy() { return null; } @Override public boolean hasThisBuddy(byte serviceId, String protocolUid) { for (FileTransfer t : mTransfers) { Buddy b = t.getParticipant(); if (b.getServiceId() == serviceId && b.getProtocolUid().equals(protocolUid)) { return true; } } return false; } @Override public void onBuddyIcon(byte serviceId, String protocolUid) { if (mAccount.getServiceId() != serviceId) { return; } if (mAdapter != null) { for (FileTransfer t : mTransfers) { if (t.getParticipant().getProtocolUid().equals(protocolUid)) { mAdapter.populate(mList.findViewWithTag(t), t); } } } } @Override public Account getAccount() { return mAccount; } @Override public void onOnlineInfoChanged(OnlineInfo info) {} @Override public Buddy getBuddyWithParameters(byte serviceId, String protocolUid) { for (FileTransfer t : mTransfers) { Buddy b = t.getParticipant(); if (b.getServiceId() == serviceId && b.getProtocolUid().equals(protocolUid)) { return b; } } return null; } @Override public void onConnectionStateChanged(ConnectionState connState, int extraParameter) {} @Override public void onContactListUpdated(Account account) {} @Override public void onAccountIcon(byte serviceId) {} @Override public void onFileProgress(FileProgress progress) { if (progress.getServiceId() != mAccount.getServiceId()) { return; } for (FileTransfer t : mTransfers) { if (t.getMessageId() == progress.getMessageId()) { t.setProgress(progress); if (mAdapter != null) { mAdapter.populate(mList.findViewWithTag(t), t); } return; } } FileTransfer newTransfer = new FileTransfer(progress.getMessageId(), mAccount.getBuddyByProtocolUid(progress.getOwnerUid())); newTransfer.setProgress(progress); if (mAdapter != null) { mAdapter.add(newTransfer); } else { mTransfers.add(newTransfer); } } @Override public void onSaveInstanceState(Bundle saver){ saver.putParcelableArrayList(SAVE_PARAM_TRANSFERS, mTransfers); } @Override public Bundle getPageDataForStorage(){ Bundle saver = new Bundle(); onSaveInstanceState(saver); return saver; } private void recoverFromStoredData(Bundle bundle){ if (bundle == null) { return; } ArrayList<FileTransfer> transfers = bundle.getParcelableArrayList(SAVE_PARAM_TRANSFERS); mTransfers.addAll(transfers); } }